//
//  SparkChainApi.swift
//  GLUZSwift
//
//  Created by xyanl on 2025/3/26.
//  Copyright © 2025 考拉🐨. All rights reserved.
//

import UIKit
import Moya

// RequestAPI就是一个遵循TargetType协议的枚举
enum SparkChainApi {
    // 正式
    /// 上传给科大讯飞音频文件
    /// - Parameters:
    ///   - appId: appId
    ///   - appKey: appKey
    ///   - filePath: 文件路径
    ///   - language: 音频文件的语言种类，中文：cn，俄语：ru
    case uploadFile(appId: String, appKey: String, filePath: String, language: String = "cn")
    /// 根据科大讯飞返回的订单 id，获取转写结果
    /// - Parameters:
    ///   - appId: appId
    ///   - appKey: appKey
    ///   - orderId: 订单 id
    ///   - resultType: 查询结果类型：默认返回转写结果
    ///   转写结果：transfer；
    ///   翻译结果：translate；
    ///   质检结果：predict；
    ///   组合结果查询：多个类型结果使用”,”隔开，
    ///   目前只支持转写和质检结果一起返回，不支持转写和翻译结果一起返回（如果任务有失败则只返回处理成功的结果）
    ///   转写和质检结果组合返回：transfer，predict
    ///   注：使用质检功能请先在控制台开启
    case getResult(appId: String, appKey: String, orderId: String, resultType: String)
    
    // 占位
    case placeholderApi
}

extension SparkChainApi: TargetType {
    // 请求地址
    var baseURL: URL {
        return URL(string: "https://raasr.xfyun.cn")!
    }
    
    // 请求API
    var path: String {
        switch self {
        case .uploadFile: return "/v2/api/upload"
        case .getResult: return "/v2/api/getResult"
            
        default:
            fatalError("Request path is null")
        }
    }
    // 请求方式: post/get
    var method: Moya.Method {
        switch self {
        case .uploadFile:
            return .post
            
        default: // 默认post请求
            return .post
        }
    }
    
    // 请求任务
    var task: Moya.Task {
        // 公共参数
        var params: [String: Any] = [:]
        // params["token"] = "a1c965c2-2308-4de6-bb10-354ae8845a6e"
        // params["client"] = "app"
        
        // 根据不同的接口传入不同的参数
        switch self {
            
        case .uploadFile(let appId, let appKey, let filePath, let language):
            
            // 签名元组
            let signaTuple = SparkChainConfig.createSigna(appId: appId, appKey: appKey)
            // 时间戳
            let timestamp = signaTuple.0
            xLog("timestamp : \(timestamp)")
            let signa = signaTuple.1
            xLog("signa : \(signa)")
            
            let fileURL = URL(fileURLWithPath: filePath) // 替换为你的文件路径
            let fileName = fileURL.lastPathComponent
            do {
                let audioData = try Data(contentsOf: fileURL)
                params["fileName"] = fileName
                params["fileSize"] = audioData.count
                params["duration"] = SparkChainConfig.getAudioDuration(url: fileURL)
                params["appId"] = appId
                params["ts"] = timestamp
                params["signa"] = signa
                params["language"] = language
                
                return .requestCompositeData(bodyData: audioData, urlParameters: params)
                
            } catch {
                xLog("音频数据加载失败: \(error.localizedDescription)")
                // 捕获并处理任何加载音频文件时的错误
                return .requestPlain
            }
            
        case .getResult(let appId, let appKey, let orderId, let resultType):
            
            // 签名元组
            let signaTuple = SparkChainConfig.createSigna(appId: appId, appKey: appKey)
            // 时间戳
            let timestamp = signaTuple.0
            xLog("timestamp : \(timestamp)")
            let signa = signaTuple.1
            xLog("signa : \(signa)")
            
            params["orderId"] = orderId
            params["resultType"] = resultType
            params["appId"] = appId
            params["ts"] = timestamp
            params["signa"] = signa
            
            return .requestCompositeParameters(bodyParameters: [:], bodyEncoding: JSONEncoding.default, urlParameters: params)
            
        default:
            break
        }
        
        // 设置请求类型, 比如没有参数的请求、有参数的请求、上传文件、下载文件
        switch self {
        case .placeholderApi:
            // 没有请求参数的请求。
            return .requestPlain
            
        default:
            // 默认有请求参数
            if method == .get {
                // 在发起GET请求时，确保使用 URLEncoding.default 编码方式，这样参数会被正确添加到URL的查询字符串中，而不是作为请求体发送。
                return .requestParameters(parameters: params, encoding: URLEncoding.default)
            }
            return .requestParameters(parameters: params, encoding: JSONEncoding.default)
        }
    }
    
    // 公共头部信息
    var headers: [String: String]? {
        var headers: [String: String] = [:]
        headers["Content-type"] = "application/json;charset=UTF-8"
        headers["requestStartTime"] = String(CFAbsoluteTimeGetCurrent())
        
        switch self {
        case .uploadFile:
            headers["Content-type"] = "application/octet-stream"
            
        default:
            return headers
        }
        
        return headers
    }
    
}

